Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

경북대 Android_유지예_1주차_과제 #10

Open
wants to merge 39 commits into
base: yjy1220
Choose a base branch
from

Conversation

YJY1220
Copy link

@YJY1220 YJY1220 commented Jun 27, 2024

1단계

1단계 커밋 링크

https://github.com/kakao-tech-campus-2nd-step2/android-contacts/pull/10/files/e0fa7b57b218306e3f2a6ee34359abe9ae9f3f22

코드 작성 시 어려웠던 점

  • UI 작성이 쉽지 않았습니다. 폼 형태를 참고 영상에 있는 형태랑 유사하게 제작해보려고 했는데 그다지 잘 되지 않았습니다. 따로 round_background.xml 파일을 만들어서 해보려했지만 참고 영상과 똑같이 구현되지 않았습니다.
  • 성별 선택 시에 옆에 radiogroup으로 여성, 남성 선택하는 걸 구현할 때 LinearLayout으로 TextView와 RadioGroup을 모두 감싸서 구현하기는 했지만 너무 코드가 더러워져서 이 외에 더 좋은 방안이 있진 않았을 지 아쉬움이 남습니다.

코드 리뷰 시 멘토님께서 중점적으로 봐주셨으면 하는 부분

  • UI를 깔끔하게 만드는 방안이 궁금합니다.
  • toggle 등 대부분의 숨기고 보여지는 걸 계속 구글링해서 결국엔 visibility로 구현했는데 코드가 꽤 길어진 거 같아 더 좋은 방안은 없을지 궁금합니다.
  • 성별 선택 시에 여성, 남성을 참고영상처럼 오른쪽 정렬하고 싶은데 어떻게 하면 되는지 잘 모르겠습니다. 방법이 궁금합니다.

2단계

2단계 커밋 링크

https://github.com/kakao-tech-campus-2nd-step2/android-contacts/pull/10/files/e0fa7b57b218306e3f2a6ee34359abe9ae9f3f22..e9e8ec968748d5f2efdb438d96e3a1f8f869bce2

코드 작성 시 어려웠던 점

  • contact 객체를 생성해서 intent로 바인딩할 때 parcelable을 사용하는 게 어려웠습니다. parcelable 개념이 익숙치 않아 제대로 다시 공부하고 구현해야했습니다.
  • RecyclerView에서 상세 정보를 조회화면으로 이동하는 것이 어려웠습니다. RecyclerView를 이용해 스크롤이 되도록 하는 것도 쉽지 않았는데 상세정보로 이동하기 위해서 contact 객체를 바인딩해야했습니다. 이 부분이 익숙치 않아 다른 구글링 코드를 많이 참고했는데 스스로 작성하기는 아직도 쉽지 않은 거 같습니다.

코드 리뷰 시 멘토님께서 중점적으로 봐주셨으면 하는 부분

  • 1단계에서 작성한 코드를 그대로 붙이면 크게 문제가 없을 줄 알았는데 mainactivity와 contactdetailactivity로 contact 객체 정보가 왔다갔다 하게 하기 위해서는 intent 정보를 주고 받는 수정이 필요했습니다. 그 과정에서 놓치는 부분이 많았는데 아무리 주석으로 미리 코드 자리를 표현해놨다고 해도 쉽지 않았습니다. 기능 구현 시 놓치는 부분 없이 빠짐없이 구현하기 위해서는 어떻게 하면 좋을지 궁금합니다.
  • 여전히 기능별로 커밋하는게 쉽지 않습니다. 어떻게 하면 기능별로 구현할 수 있을지 궁금합니다.
  • 맨토님께서 클론코딩 때 설명해주셨던 말씀을 듣고 최대한 제가 편한대로 가독성있게 코드를 풀어서 작성했습니다. 그 결과 제가 작성하고 코드를 이해하는데는 더 쉬웠지만 코드가 더러워진 것 같습니다. 어떻게 하면 깔끔한 클린 코딩이 가능할지 궁금합니다.

과제 후 느낀 점

이번 과제는 정말 쉽지 않았던 거 같습니다. 제 실력이 부족해서겠지만 모르는 것도 많았고 하나의 코드를 구현하기 위해서 찾아봐야하는 개념이 더 많았던 과제 같습니다. 과제를 하기 전보다 확실히 지식이 늘어난 느낌이긴 하지만 클린코드 작성과 기능별 커밋기록 등 기본적인게 아직 많이 부족하다고 느낍니다. 다음 과제에서는 더 나아진 모습을 보일 수 있었으면 좋겠습니다.


구현 화면

실행 영상 (전체 실행영상)

[https://youtu.be/re7rHcPNlhE](https://youtu.be/UEXYAcABTMc)

@YJY1220 YJY1220 changed the base branch from main to yjy1220 June 29, 2024 00:43
@acious
Copy link

acious commented Jun 30, 2024

여전히 기능별로 커밋하는게 쉽지 않습니다. 어떻게 하면 기능별로 구현할 수 있을지 궁금합니다.

git의 커밋 스쿼시를 잘 활용해보세요.
여러 조각조각의 커밋을 하나로 합치면서 새로운 커밋 메시지를 작성할수있고, 거기에 큰단위의 기능을 메시지로 쓴다면 결국 커밋메시지를 기능단위마다 관리할수 있습니다. :)

val name: String,
val phone: String,
val email: String?,
val birth: String?,
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

날짜를 좀 더 직접적으로 나타내는 Date나 Kotlin.date.Instant 에 대해서도 알아보면 어떨까 합니다. :)

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아하, 날짜를 더 직접적으로 나타내는 방법이 있었는지 몰랐습니다. 더 공부해보겠습니다. 감사합니다!

Comment on lines +79 to +80
val moreLayout = findViewById<LinearLayout>(R.id.moreLayout)
val moreText = findViewById<TextView>(R.id.moreText)
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

메소드를 실행시킬때마다 비싼 xml 파싱을 통해 뷰를 탐색해내는 findViewBy 를 실행하는 것이 아닌,
액티비티가 열렸을때 one-time만 이것들을 호출하여 필드 인스턴스를 할당하고 그것을 계속 재사용하는게 성능측면에서 더 좋아보입니다.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

b40e90a
따로 빼서 한 번만 호출 후 재사용하는 식으로 수정했습니다!

selectedDate.set(year, month, day)
val setting = SimpleDateFormat("yyyy.MM.dd", Locale.getDefault())
val formDate = setting.format(selectedDate.time)
findViewById<TextView>(R.id.birthText).text = formDate
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

런타임 성능에 영향을 줄수있습니다.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

e9cdf63
이전 커밋에서 findViewById를 한번만 호출하도록 수정해서 birthText부분도 런타임성능에 영향을 주지 않도록 변경했습니다. 커밋을 두 번 나누어 진행했습니다!

Comment on lines 16 to 27
val nameText = findViewById<EditText>(R.id.nameText)
val phoneText = findViewById<EditText>(R.id.phoneText)
val emailText = findViewById<EditText>(R.id.emailText)
val birthText = findViewById<TextView>(R.id.birthText)
val memoText = findViewById<EditText>(R.id.memoText)
val moreLayout = findViewById<LinearLayout>(R.id.moreLayout)
val moreText = findViewById<TextView>(R.id.moreText)
val cancelButton = findViewById<Button>(R.id.cancelButton)
val saveButton = findViewById<Button>(R.id.saveButton)
val genderRadio = findViewById<RadioGroup>(R.id.genderRadio)
val femaleButton = findViewById<RadioButton>(R.id.femaleButton)
val maleButton = findViewById<RadioButton>(R.id.maleButton)
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

private 필드변수화 필요.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

e81c6e9
private 필드변수화 완료했습니다.
여러 개를 한번에 수정하다보니 하나의 커밋에 기능 변경사항이 여러개가 되었는데 다음부터는 하나의 커밋에 하나의 변경사항만 담겠습니다..!

resultIntent.putExtra("contact", contact)
setResult(RESULT_OK, resultIntent)

Toast.makeText(this, "저장되었습니다.", Toast.LENGTH_SHORT).show()
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"저장되었습니다." String은 추후에 영어등의 다른 언어로 번역해서 쓰일수있으니 strings.xml에서 관리하는게 어떨까요?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

e81c6e9
strings.xml에서 관리하도록 변경했습니다!


//intent로 결과 반환
val resultIntent = Intent()
resultIntent.putExtra("contact", contact)
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

보통 이런 요소는 Constant라는 object를 파일단위로 생성하고
const val NAV_KEY_POSITION = "contact"를 변수로 세팅하여 사용합니다.
그리고 받는쪽에서도 이것을 사용하는거죠.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

객체 자체를 넣기보다는 전화번호부의 키값이 될만한 별도의 id 값이나, 혹은 현재까지 세팅된 것중에서는 phone 번호만 넘기고 넘어가는 다음페이지에서 해당 정보를가지고 쿼리를 하듯이 별도로 Contact를 로드해오는게 이상적으론 더 나은 구현이긴합니다.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

넵, 다음엔 그렇게 구현해보겠습니다..! 더 코드가 깔끔해질 것 같습니다. 감사합니다!

val memoLabelText = findViewById<TextView>(R.id.memoLabelText)

//parcel에 적어서 intent로 전달된 contact 객체 가져오기
val contact = intent.getParcelableExtra<Contact>("contact")
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Parcelable을 써보는것도 좋지만, 여러 객체중 측정 객체를 식별해낼수있는 key 개념만을 전달하고 받아서 동일한 기능을 처리하는 방식으로 로직을 구성해보면 좋겠습니다.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

구현 시에는 하나에만 꽂혀서 해당 로직 방법을 생각해보지 못했었습니다. 다음엔 해당 로직처럼 구성해보겠습니다. 감사합니다!

class ContactsAdapter (
//contact 객체 데이터 저장
val contacts : List<Contact>,
val clickListner : (Contact) -> Unit
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(Contact) -> Unit 람다 형태로 이벤트를 처리하는게 꼭 필요했을까요?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

단순히 조금 더 깔끔할 거라고 생각해서 작성했습니다.
다음부터는 더 신중히 생각해보고 작성하겠습니다.

Comment on lines 120 to 140
<RadioGroup
android:id="@+id/genderRadio"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">

<!-- female radio -->
<RadioButton
android:id="@+id/femaleButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="여성" />

<!-- male radio -->
<RadioButton
android:id="@+id/maleButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="남성" />
</RadioGroup>
</LinearLayout>
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이부분이 더럽다고 생각하신걸까요~?
커스텀뷰를 배운다면 이런걸 직접 정의한 View 클래스를 이용해서 해결할수도 있겠지만 지금은 이정도도 충분히 최선이라고 생각합니다.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

라디오그룹을 맨 끝으로 보내기위해서는 이런 코드를 작성하면 해결이 될것으로 보이네요.

<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

<TextView
                android:id="@+id/genderText"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="성별"
                android:textColor="@android:color/darker_gray"
                android:padding="10dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toStartOf="@id/genderRadio"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"/>
        
        <RadioGroup
                android:id="@+id/genderRadio"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                        app:layout_constraintStart_toEndOf="@id/genderText"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent">

                <!-- female radio -->
                <RadioButton
                    android:id="@+id/femaleButton"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="여성" />

                <!-- male radio -->
                <RadioButton
                    android:id="@+id/maleButton"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="남성" />
            </RadioGroup>

</androidx.constraintlayout.widget.ConstraintLayout>

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

e81c6e9
위의 xml파일처럼 수정했습니다. 감사합니다!

Comment on lines +82 to +89
if(moreLayout.visibility == LinearLayout.GONE){
moreLayout.visibility = LinearLayout.VISIBLE
moreText.visibility = TextView.GONE
}
else {
moreLayout.visibility = LinearLayout.GONE
moreText.visibility = TextView.VISIBLE
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Activity에서 이런 처리에 대한 책임이 있는것이 문제가 있는건 아닙니다.
걱정하지 말고 이런 로직을 넣으셔도 된다고 생각합니다.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아하 넵, 알겠습니다! 감사합니다!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants